package br.senai.sc.controller;

import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import br.senai.sc.dao.GenericDAOImp;
import br.senai.sc.entity.Edital;
import br.senai.sc.entity.Lance;
import br.senai.sc.entity.ProdutoServico;
import br.senai.sc.entity.Usuario;

@ManagedBean
@SessionScoped
public class LanceController implements Serializable {

	private static final long serialVersionUID = 1L;
	private List<Lance> lancesEdital;
	private Lance lance;
	private Edital edital;
	private Usuario usuario;
	private ProdutoServico produtoServico;
	private GenericDAOImp<?, ?> dao;
	private Lance menorLance;

	/* private List<Usuario> lancesPorUsuarios; */

	@SuppressWarnings("rawtypes")
	public LanceController() {
		dao = new GenericDAOImp();
		if (lance == null) {
			lance = new Lance();
		}
		// lancesEdital = dao.listAll(Lance.class);
	}

	@PostConstruct
	public void init() {
		lancesEdital = dao
				.listAllByProperty(Lance.class, "edital", getEdital());
	}

	public Edital getEdital() {
		return edital;
	}

	public ProdutoServico getProdutoServico() {
		return produtoServico;
	}

	public void setProdutoServico(ProdutoServico produtoServico) {
		this.produtoServico = produtoServico;
	}

	public String setEdital(Edital edital) {
		this.edital = edital;

		produtoServico = edital.getProdutoServico();
		edital.setNumAcessos((edital.getNumAcessos() == null ? 0 : edital
				.getNumAcessos()) + 1);
		dao.merge(edital);
		return "/pages/edital/detalheedital";
	}

	public Lance getLance() {
		return lance;
	}

	public void setLance(Lance lance) {
		this.lance = lance;
	}

	public List<Lance> getLancesEdital() {
		lancesEdital = dao
				.listAllByProperty(Lance.class, "edital", getEdital());
		return lancesEdital;
	}

	public void setLancesEdital(List<Lance> lancesEdital) {
		this.lancesEdital = lancesEdital;
	}

	public Usuario getUsuario() {
		if (usuario == null) {
			LoginController loginController = (LoginController) FacesContext
					.getCurrentInstance().getExternalContext().getSessionMap()
					.get("loginController");
			if (loginController != null && loginController.getUsuario() != null) {
				setUsuario(loginController.getUsuario());
			}
		}
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String salvarLance() {
		lance.setDataHora(Calendar.getInstance());
		lance.setEdital(getEdital());
		lance.setUsuario(getUsuario());
		if (validarLance() == null) {
			dao.create(lance);
		} else {
			System.out.println("BROTA UMA MENSAGEM");
		}
		lance = new Lance();
		return "detalheedital";
	}

	public Lance getMenorLance() {
		menorLance = null;
		if (getLancesEdital() == null || getLancesEdital().isEmpty()) {
			return menorLance;
		} else {
			for (Lance lance : lancesEdital) {
				if (menorLance == null) {
					menorLance = lance;
				} else if (menorLance.getValor() > lance.getValor()) {
					menorLance = lance;
				}
			}
		}
		return menorLance;
	}

	public void setMenorLance(Lance menorLance) {
		this.menorLance = menorLance;
	}

	public String getQtdLances() {
		if (getLancesEdital() == null) {
			return "Nenhum lance.";
		}
		return getLancesEdital().size() + "";
	}

	public String validarLance() {
		if (menorLance == null) {
			if (lance.getValor() <= edital.getValor_max()) {
				return null;
			} else {
				FacesContext.getCurrentInstance().addMessage(
						"messagesDetalhe",
						new FacesMessage("O novo lance deve ser no m�nimo R$"
								+ edital.getDecrementoMinimo()
								+ " menor que o valor m�ximo do edital."));
				return "ERRO";
			}
		} else {
			if (lance.getUsuario().getUsuario()
					.equals(menorLance.getUsuario().getUsuario())) {
				FacesContext.getCurrentInstance().addMessage("messagesDetalhe",
						new FacesMessage("O menor lance atual � seu."));
				return "ERRO";
			} else {
				if (edital.getDecrementoMinimo() == null) {
					edital.setDecrementoMinimo(1.00);
				}
				if (lance.getValor() < menorLance.getValor()
						- edital.getDecrementoMinimo()) {
					return null;
				} else {
					FacesContext
							.getCurrentInstance()
							.addMessage(
									"messagesDetalhe",
									new FacesMessage(
											"O novo lance deve ser no m�nimo R$"
													+ edital.getDecrementoMinimo()
													+ " menor que o lance m�nimo atual."));
					return "ERRO";
				}
			}
		}
	}

}
